color chooser: Fix fallout from floatification
authorMatthias Clasen <mclasen@redhat.com>
Sat, 22 Feb 2020 00:56:44 +0000 (19:56 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 22 Feb 2020 00:56:44 +0000 (19:56 -0500)
We are using (dddd) variants to store colors in variants,
which is dangerous now that GdkRGBA members are just floats.

Avoid passsing the GdkRGBA members directly to any varargs
functions.

gtk/gtkcolorchooserwidget.c
gtk/gtkcolorswatch.c

index 0b6b3afe4bde9a468cd7128e5d49c27e3b9c65dc..269c6a26e86c4e2593cf93dac963cc9f00b0d3f6 100644 (file)
@@ -115,6 +115,7 @@ select_swatch (GtkColorChooserWidget *cc,
 {
   GtkColorChooserWidgetPrivate *priv = gtk_color_chooser_widget_get_instance_private (cc);
   GdkRGBA color;
+  double red, green, blue, alpha;
 
   if (priv->current == swatch)
     return;
@@ -127,8 +128,12 @@ select_swatch (GtkColorChooserWidget *cc,
 
   gtk_color_swatch_get_rgba (swatch, &color);
 
+  red = color.red;
+  green = color.green;
+  blue = color.blue;
+  alpha = color.alpha;
   g_settings_set (priv->settings, "selected-color", "(bdddd)",
-                  TRUE, color.red, color.green, color.blue, color.alpha);
+                  TRUE, red, green, blue, alpha);
 
   if (gtk_widget_get_visible (GTK_WIDGET (priv->editor)))
     gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->editor), &color);
@@ -180,8 +185,15 @@ save_custom_colors (GtkColorChooserWidget *cc)
     {
       child = l->data;
       if (gtk_color_swatch_get_rgba (GTK_COLOR_SWATCH (child), &color))
-        g_variant_builder_add (&builder, "(dddd)",
-                               color.red, color.green, color.blue, color.alpha);
+        {
+          double red, green, blue, alpha;
+
+          red = color.red;
+          green = color.green;
+          blue = color.blue;
+          alpha = color.alpha;
+          g_variant_builder_add (&builder, "(dddd)", red, green, blue, alpha);
+        }
     }
 
   variant = g_variant_builder_end (&builder);
@@ -499,9 +511,14 @@ gtk_color_chooser_widget_activate_color_customize (GtkWidget  *widget,
 {
   GtkColorChooserWidget *cc = GTK_COLOR_CHOOSER_WIDGET (widget);
   GtkColorChooserWidgetPrivate *priv = gtk_color_chooser_widget_get_instance_private (cc);
+  double red, green, blue, alpha;
   GdkRGBA color;
 
-  g_variant_get (parameter, "(dddd)", &color.red, &color.green, &color.blue, &color.alpha);
+  g_variant_get (parameter, "(dddd)", &red, &green, &blue, &alpha);
+  color.red = red;
+  color.green = green;
+  color.blue = blue;
+  color.alpha = alpha;
 
   gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->editor), &color);
 
@@ -517,8 +534,13 @@ gtk_color_chooser_widget_activate_color_select (GtkWidget  *widget,
 {
   GtkColorChooserWidget *cc = GTK_COLOR_CHOOSER_WIDGET (widget);
   GdkRGBA color;
+  double red, green, blue, alpha;
 
-  g_variant_get (parameter, "(dddd)", &color.red, &color.green, &color.blue, &color.alpha);
+  g_variant_get (parameter, "(dddd)", &red, &green, &blue, &alpha);
+  color.red = red;
+  color.green = green;
+  color.blue = blue;
+  color.alpha = alpha;
 
   _gtk_color_chooser_color_activated (GTK_COLOR_CHOOSER (cc), &color);
 }
index ac40dfae8c4d9dd94b4cb3210ca02fd072a8f005..bc7a4c9fc86f73f317edb32f1ce9f910b6861fc8 100644 (file)
@@ -167,24 +167,30 @@ static void
 activate_color (GtkColorSwatch *swatch)
 {
   GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
+  double red, green, blue, alpha;
+
+  red = priv->color.red;
+  green = priv->color.green;
+  blue = priv->color.blue;
+  alpha = priv->color.alpha;
+
   gtk_widget_activate_action (GTK_WIDGET (swatch),
-                              "color.select", "(dddd)",
-                              priv->color.red,
-                              priv->color.green,
-                              priv->color.blue,
-                              priv->color.alpha);
+                              "color.select", "(dddd)", red, green, blue, alpha);
 }
 
 static void
 customize_color (GtkColorSwatch *swatch)
 {
   GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
+  double red, green, blue, alpha;
+
+  red = priv->color.red;
+  green = priv->color.green;
+  blue = priv->color.blue;
+  alpha = priv->color.alpha;
+
   gtk_widget_activate_action (GTK_WIDGET (swatch),
-                              "color.customize", "(dddd)",
-                              priv->color.red,
-                              priv->color.green,
-                              priv->color.blue,
-                              priv->color.alpha);
+                              "color.customize", "(dddd)", red, green, blue, alpha);
 }
 
 static gboolean
@@ -222,17 +228,19 @@ gtk_color_swatch_get_menu_model (GtkColorSwatch *swatch)
   GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
   GMenu *menu, *section;
   GMenuItem *item;
+  double red, green, blue, alpha;
 
   menu = g_menu_new ();
 
+  red = priv->color.red;
+  green = priv->color.green;
+  blue = priv->color.blue;
+  alpha = priv->color.alpha;
+
   section = g_menu_new ();
   item = g_menu_item_new (_("Customize"), NULL);
   g_menu_item_set_action_and_target_value (item, "color.customize",
-                                           g_variant_new ("(dddd)",
-                                                          priv->color.red,
-                                                          priv->color.green,
-                                                          priv->color.blue,
-                                                          priv->color.alpha));
+                                           g_variant_new ("(dddd)", red, green, blue, alpha));
 
   g_menu_append_item (section, item);
   g_menu_append_section (menu, NULL, G_MENU_MODEL (section));